				;SYMBOL DEFINITIONS
	RTRAP=%0	;TRAP WORD SAVED HERE ON TRAP
	RSTAT=%1	;STATUS	WORD OF TRAPPING ROUTINE IS SAVED HERE
	RQSTAT=%2	;QUEUE POINTER IS SAVED FOR TRAP ROUTINE
	RQSCHP=%1	;POINTER TO WORD IN CURRENT Q IS HERE
	RQSTAP=%0	;POINTER TO HEAD OF Q BEING SERCHED IS HERE
	R0=%0
	R1=%1
	R2=%2
	R3=%3
	R4=%4
	R5=%5
	SP=%6
	STATUS=177776


				;MINEX A SIMPLE MINDED SCHEDULER
				;STARTS HERE
HRWEGO:	MOV #576,SP		;STACK WILL START AT 577
				;THE FIRST TIME WE ENTER IDLE
				;ROUTINE
ENTRY:	MOV	#340,STATUS	;SET BR7
	MOV	#QSTAHI,RQSTAP	;MOVE QUEUE STATUS
				;TABLE POINTER INTO REGISTER
REPSCH:	MOV	RQSTAP,RQSCHP
	TST	(RQSCHP)+
	BNE	RETINT
	TST	@RQSCHP		;IS THIS JOB AT AN INTERRUPT
				;LEVEL
	BMI	RETINT		;IF MINUS THEN WE ARE AT
				;AN INTERRUPT ROUTINE AT
				;THIS LEVEL
	TSTB	(RQSCHP)+	;OTHERWISE CHECK WHETHER
				;THE JOB IS IN A WAIT STATE
				;AND IS READY FOR SERVICE
	BMI	COMPLT		;IF NEGATIVE THEN A WAIT IS OVER

	BEQ	NEW		;IF NO WAIT BIT THEN LOOK
				;FOR NEW JOB
DONE:	CMP	RQSTAP,#QSTALO	;IS THIS THE LAST Q
	BEQ	IDLE		;END OF LIST THEN IDLE
	SUB	#20,RQSTAP	;POINT TO NEXT LOWER Q
	BR	REPSCH		;CONTINUE SEARCH
IDLE:	CMP	(SP)+,(SP)+	;BUMP SP BY TWO TO CLEAR PREVIOUS
	SUB	#340,STATUS	;INTERRUPT STORED PC & STATUS WORD.
	BR	.		;DO NOTHING
RETINT:	JSR	R5,POP		;POP REGISTERS AS THIS WAS AN
				;INTERRUPTED RTN
	RTI			;RETURN TO INTERRUPTED ROUTINE
COMPLT:	CLRB	-(RQSCHP)	;CLEAR COMPLETION WORD
	INC	-(RQSCHP)	;SET THE ACTIVE WORD

	JMP	14(RQSCHP)	;JUMP TO ENTRY POINT ROUTINE MUST
				;SET ITS OWN PRIORITY LEVEL
NEW:	INC	RQSCHP		;SET REGISTER TO POINT AT NEXT WORD
	CMP	(RQSCHP)+,@RQSCHP	;DATAIN=DATOUT PTR:POINTS AT 6
	BEQ	DONE		;NO DATA THEN QUET
	MOV	@(RQSCHP)+,R0	;PUT DATA POINTER IN R0
	INC	-10(RQSCHP)	;SET ACTIVE WORD
	CMP	@RQSCHP,-(RQSCHP)	;CHECK FOR END OF BUFFER
	BEQ	RESET		;RESET OUTPUT BUFFER PTR
	ADD	#2,@RQSCHP	;POINT TO NEXT OUTPUT LOC.
LEAVE:	JMP	+6(RQSCHP)	;GO TO ENTRY POINT OF ROUTINE
				;POINTER AT HEAR+6
RESET:	MOV	2(RQSCHP),@RQSCHP	;RESET DATA POINTER TO HEAD OF
				;DATA BUFFER
	BR	LEAVE		;GO TO ENTRY POINT OF REQUESTED
				;ROUTINE
					;
				;
				;
				;THIS ROUTINE HANDLES
				;TRAPS TO THE MONITOR
				;THESE TRAPS CAN COME
				;FROM INTERRUPT SERVICE
				;ROUTINE OR USER RTN
				;A DATA POINTER IS TRANSFERRED
				;THRU REG. ZERO
				;
TRAP:	MOVB	(SP)+,#0
	GETPC=.-2		;RETURN PC GOES HERE
	MOV	@SP,#0
	GSTAT=.-2		;PRIORITY LEVEL HERE
	TST	(SP)+		;SET SP PROPERLY
	JSR	R5,PUSH		;SAVE REGISTERS
	MOV	GETPC,RTRAP	;PUT PC IN R0
	MOV	GSTAT,RSTAT	;PUT STAT IN R1
	MOV	-2(R0),RTRAP	;R0 LOADED WITH TRAP INST.
	BIC	#340,RSTAT	;GET STAT OF INTERRUPTED RTN
	ASR	RTRAP		;DIVIDE BY TWO
	ASR	RSTAT		;DIVIDE BY TWO
	CMP	RTRAP,RSTAT	;COMPARE REQUESTING AND
				;REQUESTED PRIORITY LEVEL
	BEQ	COMPLE		;THIS INDICATES A TIME OUT
				;REQUEST
	CMP	#160,RTRAP	;CHECK FOR SERVICE REQUEST
				;OTHER THAN 0-7
	BMI	FINISH		;THIS IMPLIES CALL FOR
				;RETURN TO MONITOR
	MOV	RTRAP,RQSTAT	;SAVE REQUESTED PRIORITY
				;CONTINUE HERE TO PUT REQUEST
				;IN 0
	ADD	#QSTALO+4,RQSTAT	;R2 NOW POINTS TO QSTATUS
				;ENTRY "DATA IN" POINTER
	MOV	@SP,@(RQSTAT)+	;PUT DATA POINTER IN THE
				;DATA Q. DATA POINTER WAS
				;IN R0
	CMP	-(RQSTAT),4(RQSTAT)	;CHECK WHETHER CURRENT
				;POINTER IS THE LAST LOCATION
	BNE	OVRTAK		;CHECK WHETHER DANGER OF
				;OVERTAKING
	MOV	6(RQSTAT),@RQSTAT	;MOVE START OF DATA BUFFER
				;AREA TO INPUT POINTER
				;LOCATION

OVRTAK:	ADD	#2,@RQSTAT	;SET INPUT POINTER TO NEW
				;LOCATION
	CMP	(RQSTAT)+,(RQSTAT)+	;COMPARE INPUT AND OUTPUT
				;POINTER
	BEQ	ERROR		;ERROR ROUTINE AS DATA BUFFER
				;IS ABOUT TO OVERFLOW
	CMP	RTRAP,RSTAT
	BGT	BCKRTN		;IF LEVEL OF REQUESTING
				;RTN IS GREATER THAN REQUESTED
				;ROUTINE THEN RETURN TO
				;REQUESTING ROUTINE OTHERWISE
				;SIMULATE AN INTERRUPT AND GO
				;TO REQUESTED ROUTINE IF YOU
				;CAN
				;NOTE STATUS & REGISTERS OF
				;CALLING ROUTINE ARE ON THE
				;STACK
	ADD	#QSTALO,RQSTAP	;GET QSTATUS WORD Q ADDRESS BY ADDING CONST. TO RQSTD. PRI. LEV.
	BR	REPSCH		;GO TO MONITOR SEARCH ROUTINE
				;AT Q OF REQUESTED LEVEL
COMPLE:	ADD	#QSTALO,RQSTAP	;GET ADDRESS OF REQUIRED Q
	CLR	@(RQSTAP)+	;CLEAR ACTIVE WORD
	INC	@(RQSTAP)+	;SET COMPLETION WORD
FINISH:	ADD	#10,SP		;TAKE UNNEEDED REG. OFF
				;STACK, ALSO PC & STATUS
				;WORD
	BR	ENTRY		;GO BACK TO HEAD OF Q & START
				;SEARCH AGAIN.SEARCH STARTS AT HEAD OF 
				;AS Q AS ENTRY COULD HAVE BEEN FROM AN
				;INTERRUPT SERVICE ROUTINE
				;WHICH HAS SET THE DONE FLAG FOR
				;A HIGHER LEVEL ROUTINE.
BCKRTN:	JSR	R5,POP		;RETURN TO ROUTINE
	RTI			;WHICH TRAPPED
POP:	TST	(SP)+	;INCREMENT STACK POINTER
	MOV	(SP)+,R0	;RESTORE REGISTER
	MOV	(SP)+,R1
	MOV	(SP)+,R2
	MOV	(SP)+,R4
	RTS	R5

PUSH:	MOV	R4,-(SP)	;SAVE REGISTERS
	MOV	R3,-(SP)
	MOV	R2,-(SP)
	MOV	R0,-(SP)
	JMP	R5
	QSTALO=.	;START Q STATUS WORD Q HERE
	QSTAHI=.+170
	ERROR=.+200

	.END
    